package docker

//docker swarm
//集群
//官方文档地址 https://docs.docker.com/engine/swarm/
//https://docs.docker.com/engine/swarm/swarm-tutorial/create-swarm/

/*


	目录：
		1.docker swarm --help命令
		2.docker swarm init --help
		3.docker swarm 创建一个集群
		4.raft协议 一致性协议
		5.动态的扩缩容  弹性、扩缩容,看docker-0070-docker service*



-----------------------docker swarm命令-----------------------

		docker swarm --help


root@VM-4-8-debian:/tmp# docker swarm --help

Usage:  docker swarm COMMAND

Manage Swarm

Commands:
  ca          Display and rotate the root CA
  init        Initialize a swarm						## 初始化一个集群
  join        Join a swarm as a node and/or manager		## 加入一个集群
  join-token  Manage join tokens						## 创建token
  leave       Leave the swarm							## 离开一个集群
  unlock      Unlock swarm								## 解锁
  unlock-key  Manage the unlock key
  update      Update the swarm							## 更新

Run 'docker swarm COMMAND --help' for more information on a command.
root@VM-4-8-debian:/#



-----------------------2.docker swarm init --help-----------------------

	docker swarm init --help


[root@VM_0_13_centos ~]# docker swarm init --help

	Usage:  docker swarm init [OPTIONS]

	Initialize a swarm

	Options:
		地址：类似于广播地址，去监听
	--advertise-addr string                  Advertised address (format: <ip|interface>[:port])
	--autolock                               Enable manager autolocking (requiring an unlock key to
	start a stopped manager)
	--availability string                    Availability of the node ("active"|"pause"|"drain")
	(default "active")
	--cert-expiry duration                   Validity period for node certificates (ns|us|ms|s|m|h)
	(default 2160h0m0s)
	--data-path-addr string                  Address or interface to use for data path traffic (format:
	<ip|interface>)
	--data-path-port uint32                  Port number to use for data path traffic (1024 - 49151). If
	no value is set or is set to 0, the default port (4789) is used.
	--default-addr-pool ipNetSlice           default address pool in CIDR format (default [])
	--default-addr-pool-mask-length uint32   default address pool subnet mask length (default 24)
	--dispatcher-heartbeat duration          Dispatcher heartbeat period (ns|us|ms|s|m|h) (default 5s)
	--external-ca external-ca                Specifications of one or more certificate signing endpoints
	--force-new-cluster                      Force create a new cluster from current state
	--listen-addr node-addr                  Listen address (format: <ip|interface>[:port]) (default
	0.0.0.0:2377)
	--max-snapshots uint                     Number of additional Raft snapshots to retain
	--snapshot-interval uint                 Number of log entries between Raft snapshots (default 10000)
	--task-history-limit int                 Task history retention limit (default 5)
[root@VM_0_13_centos ~]#




-----------------------3.docker swarm 创建一个集群-----------------------



	初始化
	docker swarm init --advertise-addr string
	   地址又分为公网和私网 内部走私网


	docker-1创建集群，本身作为一个manager
	docker swarm init --advertise-addr 172.24.82.169 //购买的服务器的私网地址

	获取令牌
	docker swarm join-token manager  获取一段字符串，把该字符串复制，到docker-2服务器中，黏贴，回车
	docker swarm join-token worker


	加入一个节点
	docker swarm join

	docker-2 复制docker-1通过命令docker swarm join-token manager得到的字符串，回车
	this node joined a swarm as a worker 作为一个worker加入到docker-1集群

	然后回到docker-1服务器
	docker node ls  查看节点列表

	现在需要使第三台服务器加入到集群中
	可以通过命令  docker swarm join-token worker 得到一段字符串
	复制上述这段字符串，然后到docker-3服务器
	黏贴，回车
	this node joined a swarm as a worker 作为一个worker加入docker-1集群

	在回到docker-1服务器
	docker node ls  查看节点列表


	然后想docker-4成为一个manager主节点
	在docker-1使用该命令 docker swarm join-token manager,生成一段字符串，复制

	进入到docker-4服务器中
	黏贴docker-1生成的字符串，回车
	this node joined a swarm as a manager

	进入到docker-1服务器中，查看节点
	docker node ls  查看节点列表

	两主两从，集群成功

	停止docker-1中的docker
	systemctl stop docker 停止docekr
	systemctl start docker 启动docker
	然后在docker-4中使用docker nodes ls 发现docker集群已经不能运行了

	重启docker-1中的docker
	systemctl start docker
	使用docker node ls 查看
	发现docker-4已经成为了lead，docker-1成为了从机

	docker-3服务器离开集群
	docker swarm leave 离开集群
	然后让docker-3成为manager主机
	在lead机docker-4中运行命令[并不一定在docker-4的lead服务器，只要是manager管理机就行]
	docker swarm join-token manager
	生成一段token令牌
	然后复制到docker-3服务器，黏贴运行，docker-3成为一台manager管理
	然后在docker-3服务器中使用docker node  ls 查看，现在是三主一从

	在docker-1服务器中停止docker
	systemctl stop docker
	然后在docker-4服务器上运行docker node ls
	然后在docker-3服务器上运行docker node ls
	两台manager服务都可用
	原理，三台主机，停止docker-1，剩余两台，raft协议，大多数存活可用，存活了两台，现在集群能用

	停止docker-3服务中docker，然后在docker-4运行docker node ls 发现已经不可用
	原理：两台主机，停止一台docker-3，剩下一台docker-4，raft协议，大多数存活，剩下的只有一台，找不到，所以不可用

	最后回复docker-1和docekr-3服务
	systemctl start docker




-----------------------4.raft协议 一致性协议-----------------------

	//raft协议 一致性协议
	//有个raft的动画演示可以去玩玩http://thesecretlivesofdata.com/raft/
    具体算法看官方文档



*/
